From e076cc7b1f609ad278c3759563d63781f42e4dc2 Mon Sep 17 00:00:00 2001 From: Chun-wei Fan Date: Fri, 17 Nov 2017 15:27:10 +0800 Subject: [PATCH] GDK/Win32: Fix build after GDK Root Window and DND changes Ensure that things build again, and instead use the Windows API to acquire the screen dimensions (note: this may need to be scaled for HiDPI, but since I do not own a WinTab-based device, I will need to keep the dimensions as-is for now). Also update the gdkdnd-win32.c code to use formats rather than targets. https://bugzilla.gnome.org/show_bug.cgi?id=773299 --- gdk/win32/gdkdevice-win32.c | 4 ++-- gdk/win32/gdkdevice-wintab.c | 30 ++++++++++++++++++--------- gdk/win32/gdkdevicemanager-win32.c | 2 +- gdk/win32/gdkdisplay-win32.h | 1 - gdk/win32/gdkdnd-win32.c | 33 +++++++++++++++++------------- gdk/win32/gdkprivate-win32.h | 6 +++++- gdk/win32/gdkselection-win32.c | 6 +++--- 7 files changed, 50 insertions(+), 32 deletions(-) diff --git a/gdk/win32/gdkdevice-win32.c b/gdk/win32/gdkdevice-win32.c index b2ad705d99..110d73d4ce 100644 --- a/gdk/win32/gdkdevice-win32.c +++ b/gdk/win32/gdkdevice-win32.c @@ -22,9 +22,9 @@ #include #include -#include "gdkdisplayprivate.h" #include "gdkdevice-win32.h" #include "gdkwin32.h" +#include "gdkdisplay-win32.h" G_DEFINE_TYPE (GdkDeviceWin32, gdk_device_win32, GDK_TYPE_DEVICE) @@ -119,7 +119,7 @@ gdk_device_win32_query_state (GdkDevice *device, { GdkDisplay *display = gdk_device_get_display (device); - scale = GDK_WIN32_SCREEN (GDK_WIN32_DISPLAY (display)->screen)->window_scale; + scale = GDK_WIN32_DISPLAY (display)->window_scale; hwnd = NULL; } diff --git a/gdk/win32/gdkdevice-wintab.c b/gdk/win32/gdkdevice-wintab.c index 8b5d321126..0de1ecb879 100644 --- a/gdk/win32/gdkdevice-wintab.c +++ b/gdk/win32/gdkdevice-wintab.c @@ -24,7 +24,7 @@ #include "gdkwin32.h" #include "gdkdevice-wintab.h" -#include "gdkdisplayprivate.h" +#include "gdkdisplay-win32.h" G_DEFINE_TYPE (GdkDeviceWintab, gdk_device_wintab, GDK_TYPE_DEVICE) @@ -132,7 +132,7 @@ gdk_device_wintab_query_state (GdkDevice *device, { GdkDisplay *display = gdk_device_get_display (device); - scale = GDK_WIN32_SCREEN (GDK_WIN32_DISPLAY (display)->screen)->window_scale; + scale = GDK_WIN32_DISPLAY (display)->window_scale; hwnd = NULL; } @@ -144,7 +144,7 @@ gdk_device_wintab_query_state (GdkDevice *device, if (root_y) *root_y = point.y / scale; - if (hwn) + if (hwnd) ScreenToClient (hwnd, &point); if (win_x) @@ -256,13 +256,23 @@ _gdk_device_wintab_translate_axes (GdkDeviceWintab *device_wintab, device_wintab->last_axis_data[i], &axes[i]); else - _gdk_device_translate_screen_coord (device, window, - root_x, root_y, - GDK_WIN32_SCREEN (GDK_WIN32_DISPLAY (display)->screen)->width, - GDK_WIN32_SCREEN (GDK_WIN32_DISPLAY (display)->screen)->height, - i, - device_wintab->last_axis_data[i], - &axes[i]); + { + HMONITOR hmonitor; + MONITORINFO minfo = {sizeof (MONITORINFO),}; + + hmonitor = MonitorFromWindow (GDK_WINDOW_HWND (window), + MONITOR_DEFAULTTONEAREST); + GetMonitorInfo (hmonitor, &minfo); + + /* XXX: the dimensions from minfo may need to be scaled for HiDPI usage */ + _gdk_device_translate_screen_coord (device, window, + root_x, root_y, + minfo.rcWork.right - minfo.rcWork.left, + minfo.rcWork.bottom - minfo.rcWork.top, + i, + device_wintab->last_axis_data[i], + &axes[i]); + } if (use == GDK_AXIS_X) temp_x = axes[i]; else if (use == GDK_AXIS_Y) diff --git a/gdk/win32/gdkdevicemanager-win32.c b/gdk/win32/gdkdevicemanager-win32.c index eef0453f2b..3bff2107d5 100644 --- a/gdk/win32/gdkdevicemanager-win32.c +++ b/gdk/win32/gdkdevicemanager-win32.c @@ -434,7 +434,7 @@ wintab_init_check (GdkDeviceManagerWin32 *device_manager) ndevices, ncursors)); #endif /* Create a dummy window to receive wintab events */ - wintab_window = gdk_window_new_popup (display, GDK_ALL_EVENTS_MASK, &(GdkRectangle) { -100, -100, 2, 2 }); + wintab_window = gdk_window_new_popup (display, &(GdkRectangle) { -100, -100, 2, 2 }); g_object_ref (wintab_window); for (devix = 0; devix < ndevices; devix++) diff --git a/gdk/win32/gdkdisplay-win32.h b/gdk/win32/gdkdisplay-win32.h index fa1eb19122..05239c665b 100644 --- a/gdk/win32/gdkdisplay-win32.h +++ b/gdk/win32/gdkdisplay-win32.h @@ -18,7 +18,6 @@ */ #include "gdkdisplayprivate.h" -#include "gdkscreen-win32.h" #ifndef __GDK_DISPLAY__WIN32_H__ #define __GDK_DISPLAY__WIN32_H__ diff --git a/gdk/win32/gdkdnd-win32.c b/gdk/win32/gdkdnd-win32.c index 5d20b8889a..a7eb521056 100644 --- a/gdk/win32/gdkdnd-win32.c +++ b/gdk/win32/gdkdnd-win32.c @@ -46,7 +46,7 @@ * data types, and file list dnd (which is handled seperately as it predates OLE2 * both in this implementation and on Windows in general). * - * As such, the data type conversion from gdk selection targets to OLE2 CF_* data + * As such, the data type conversion from gdk selection formats to OLE2 CF_* data * type specifiers is partially hardwired. Fixing this is complicated by (a) the * fact that the widget’s declared selection types aren’t accessible in calls here * that need to declare the corresponding OLE2 data types, and (b) there isn’t a @@ -1190,8 +1190,8 @@ target_context_new (GdkWindow *window) } static source_drag_context * -source_context_new (GdkWindow *window, - GList *targets) +source_context_new (GdkWindow *window, + GdkContentFormats *formats) { GdkDragContext *context; GdkWin32DragContext *context_win32; @@ -1211,7 +1211,7 @@ source_context_new (GdkWindow *window, g_object_ref (window); result->context->dest_window = NULL; - result->context->targets = g_list_copy (targets); + result->context->formats = gdk_content_formats_ref (formats); context_win32->ole2_dnd_iface = (IUnknown *) &result->ids; idropsource_addref (&result->ids); @@ -1417,6 +1417,9 @@ gdk_dropfiles_filter (GdkXEvent *xev, POINT pt; gint nfiles, i; gchar *fileName, *linkedFile; + GPtrArray *formats; + + formats = g_ptr_array_new (); if (msg->message == WM_DROPFILES) { @@ -1432,8 +1435,10 @@ gdk_dropfiles_filter (GdkXEvent *xev, g_object_ref (context->dest_window); /* WM_DROPFILES drops are always file names */ - context->targets = - g_list_append (NULL, _text_uri_list); + g_ptr_array_add (formats, _text_uri_list); + context->formats = gdk_content_formats_new ((const char **) formats->pdata, formats->len); + g_ptr_array_unref (formats); + context->actions = GDK_ACTION_COPY; context->suggested_action = GDK_ACTION_COPY; current_dest_drag = context; @@ -1664,7 +1669,7 @@ local_send_enter (GdkDragContext *context, new_context->dest_window = context->dest_window; g_object_ref (new_context->dest_window); - new_context->targets = g_list_copy (context->targets); + new_context->formats = gdk_content_formats_ref (context->formats); gdk_window_set_events (new_context->source_window, gdk_window_get_events (new_context->source_window) | @@ -1789,11 +1794,11 @@ gdk_drag_do_leave (GdkDragContext *context, } GdkDragContext * -_gdk_win32_window_drag_begin (GdkWindow *window, - GdkDevice *device, - GList *targets, - gint x_root, - gint y_root) +_gdk_win32_window_drag_begin (GdkWindow *window, + GdkDevice *device, + GdkContentFormats *formats, + gint x_root, + gint y_root) { if (!use_ole2_dnd) { @@ -1807,7 +1812,7 @@ _gdk_win32_window_drag_begin (GdkWindow *window, new_context->source_window = window; g_object_ref (window); - new_context->targets = g_list_copy (targets); + new_context->formats = gdk_content_formats_ref (formats); new_context->actions = 0; return new_context; @@ -1820,7 +1825,7 @@ _gdk_win32_window_drag_begin (GdkWindow *window, GDK_NOTE (DND, g_print ("gdk_drag_begin\n")); - ctx = source_context_new (window, targets); + ctx = source_context_new (window, formats); _dnd_source_state = GDK_WIN32_DND_PENDING; diff --git a/gdk/win32/gdkprivate-win32.h b/gdk/win32/gdkprivate-win32.h index b40c5b4157..25c44f0904 100644 --- a/gdk/win32/gdkprivate-win32.h +++ b/gdk/win32/gdkprivate-win32.h @@ -475,7 +475,11 @@ void _gdk_win32_display_create_window_impl (GdkDisplay *display, /* stray GdkWindowImplWin32 members */ void _gdk_win32_window_register_dnd (GdkWindow *window); -GdkDragContext *_gdk_win32_window_drag_begin (GdkWindow *window, GdkDevice *device, GList *targets, gint x_root, gint y_root); +GdkDragContext *_gdk_win32_window_drag_begin (GdkWindow *window, + GdkDevice *device, + GdkContentFormats *formats, + gint x_root, + gint y_root); gint _gdk_win32_window_get_property (GdkWindow *window, GdkAtom property, diff --git a/gdk/win32/gdkselection-win32.c b/gdk/win32/gdkselection-win32.c index 9f70386f9f..336a88fa5c 100644 --- a/gdk/win32/gdkselection-win32.c +++ b/gdk/win32/gdkselection-win32.c @@ -1166,13 +1166,13 @@ gdk_win32_display_add_selection_targets (GdkDisplay *display, sel_name); g_free (sel_name); - for (i = 0; i < n_targets; i++) + for (i = 0; i < ntargets; i++) { gchar *tgt_name = gdk_atom_name (targets[i]); g_print ("%s", tgt_name); g_free (tgt_name); - if (i < n_targets - 1) + if (i < ntargets - 1) g_print (", "); } g_print ("\n"); @@ -1199,7 +1199,7 @@ gdk_win32_display_add_selection_targets (GdkDisplay *display, * support for it in Windows software, but note that alpha won't be * handled. */ - for (i = 0; !has_image && i < n_targets; ++i) + for (i = 0; !has_image && i < ntargets; ++i) { UINT cf; gchar *target_name; -- 2.30.2